import {arrayMethods} from './array.js';
import def from './utils.js';
import defineReactive from './defineReactive.js';
import observe from './observe.js';
import Dep from './Dep.js';

export default class Observer{
	constructor(value){
		//每一个observer实例上都有一个Dep用来收集依赖
		this.dep = new Dep();
		console.log('进入类Observer类中');
		//给实例（this表示实例，值的注意的是构造函数中的this是表示实例）加上属性，值是这次new的实例
		def(value,'__ob__',this,false);
		//不要忘记初心Observer类的目的是：将一个正常的objext对象转换成每个层级的属性都是响应式的（可被侦测的）的object
		// 检测是否是数组
		if(Array.isArray(value)){
			//如果是数组，就要把强行蛮干，将这个数组的原型指向arrayMethods
			Object.setPrototypeOf(value,arrayMethods);
			// 让这个数组变得observe
			this.observeArray(value);
		}else{
			this.walk(value);
		}
	};
	//遍历对象
	walk(value){
		for(let key in value){
			defineReactive(value,key);
		}
	};
	// 遍历数组
	observeArray(arr){
		for(let i=0,l=arr.length;i<l;i++){
			// 逐项进行observe
			observe(arr[i]);

		}
	}
}